/**********************************************************************************\
** 文件名称: list.h
** 创建人员: YCG
** 创建日期: 2018-12-14
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#ifndef __MYLIST_H_
#define __MYLIST_H_
#include	"main.h"

#ifndef NULL
#define NULL  0U
#endif

#define LIST_VALUE_MAX   0xFFFFFFFF

struct LIST_ITEM_T;
typedef struct LIST_ITEM_T MyListItem_t;

struct LIST_T;
typedef struct LIST_T MyList_t;
// 定义列表项结构体 占用空间 20 字节
struct LIST_ITEM_T
{
    MyListItem_t      *Pre;        //指向上一个一个列表项
    MyListItem_t      *Next;       //指向下一个列表项
    MyList_t          *Head;       //所属的列表
    uint32_t          Value;       //列表项的值
};

// 定义列表结构体 占用空间 32 字节
struct LIST_T
{
    MyListItem_t*  Index;         //此时的地址
    uint32_t       ListNum;       //列表项的数量
    MyListItem_t   EndItem[1];       //尾地址
};

//将当前的索引位置定位到第一个列表项
#define LIST_TO_HEAD(yList)  (yList->Index = yList->EndItem->Next)

//获取第一个列表项
#define LIST_GET_HEAD(yList)  (yList->EndItem->Next)

//切换到下一个列表项
#define LIST_TO_NEXT(yList)  (yList->Index = yList->Index->Next)
#define LIST_TO_PRE(yList)   (yList->Index = yList->Index->Pre)
#define LISTITEM_TO_NEXT(yListItem)  (yListItem = yListItem->Next)

//判断是不是到了列表的末尾
#define LIST_IS_END(yList)   (yList->Index ==yList->EndItem)

//判断是不是到了列表的末尾
#define LIST_IS_NOT_END(yList)   (yList->Index !=yList->EndItem)
#define LISTITEM_IS_NOT_END(yListItem)   (yListItem !=yListItem->Head->EndItem)

//循环切换到下一个列表项
#define LIST_C_TO_NEXT(yList) \
												do{\
													LIST_TO_NEXT(yList);\
													if(LIST_IS_END(yList)){\
													LIST_TO_NEXT(yList);\
													}\
												}while(0)	
												
//循环切换到下一个列表项
#define LIST_C_TO_PRE(yList) \
												do{\
													LIST_TO_PRE(yList);\
													if(LIST_IS_END(yList)){\
													LIST_TO_PRE(yList);\
													}\
												}while(0)	
												
//获取列表中的列表项数量												
#define LIST_GET_NUM(yList) (yList->ListNum)
		
//比较列表项的值 等于给定的值																			
#define ITEM_IS_EQ_VALUE(yItem，value)  (yItem->Value == value)
		
//比较列表项的值 大于给定的值																			
#define ITEM_IS_GT_VALUE(yItem，value)  (yItem->Value > value)
		
//比较列表项的值 小于给定的值																			
#define ITEM_IS_LT_VALUE(yItem，value)  (yItem->Value < value)
		
//比较列表项的值 大于等于给定的值																			
#define ITEM_IS_EGT_VALUE(yItem，value)  (yItem->Value >= value)
		
//比较列表项的值 小于等于给定的值																			
#define ITEM_IS_ELT_VALUE(yItem，value)  (yItem->Value <= value)
												
//设置列表项的值																		
#define ITEM_SET_VALUE(yItem，value)  (yItem->Value = value)
		
void ListInit(MyList_t * const yList);
void ListItemInit(MyListItem_t * const pxItem);
void ListInsertEnd(MyList_t * const yList, MyListItem_t * const yNewItem);
void ListInsert(MyList_t * const yList, MyListItem_t * const yNewItem);
void ListRemove(MyListItem_t * const pxRemoveItem);
void ListPrint(MyList_t * const yList);
#endif

/********************************End of File************************************/
